// 属性装饰器只接受 target 和 key 两个参数
// 虽然原始方法不提供 descriptor，但是我们可以自己写一个配置描述，并将其返回出来覆盖掉原始的属性描述：
function nameDecorator1(target: any, key: string): any {
  const descriptor: PropertyDescriptor = {
    // 不可修改
    writable: false,
  };
  return descriptor;
}

// test.name = 'dell lee';

// 修改的并不是实例上的 name， 而是原型上的 name
// 使用属性装饰器并不能直接修改定义的属性，因为定义的属性是定义在实例上的，而修改的是原型上的属性
function nameDecorator2(target: any, key: string): any {
  target[key] = "lee";
}

// name 放在实例上
class Test {
  @nameDecorator2
  name = "Dell";
}

const test = new Test();
// 通过原型获取由装饰器修改的属性
console.log((test as any).__proto__.name);
